<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <div id="test">
    FirstName: <input type="text" v-model="firstName"><br>
    LastName: <input type="text" v-model="lastName"><br>
    
    <!-- 使用插值语法: 可读性比较差 -->
    <p>FullName(插值): {{firstName + '-' + lastName}}</p>
    <!-- 使用method: 如果多处显示, 会调用多次 -->
    <p>fullName2(方法): {{fullName2()}}</p>
    <p>fullName2(方法): {{fullName2()}}</p>
    <p>fullName2(方法): {{fullName2()}}</p>
    <!-- 使用computed
          如果多处显示, 只会计算一次
          因为内存在第一计算缓存起来了
          初始化显示时, 会执行第一次, 并缓存起来
          只要依赖的数据发生改变, 会次计算, 并缓存起来


      依赖的数据: 在计算中用到其它数据
    -->
    <p>fullName3(计算属性): {{fullName3}}</p>
    <p>fullName3(计算属性): {{fullName3}}</p>
    <p>fullName3(计算属性): {{fullName3}}</p>
    <br>
    <br>
    <p>fullName4(监视): {{fullName4}}</p>
    <p>fullName4(监视): {{fullName4}}</p>
    <p>fullName4(监视): {{fullName4}}</p>
  </div>

  <script src="../js/vue.js"></script>
  <script>
    const vm = new Vue({
      el: "#test",
      data: {
        firstName: 'A',
        lastName: 'B',
        fullName4: 'A-B'
      },

      methods: {
        fullName2 () {
          console.log('method fullName2()')
          return this.firstName + '-' + this.lastName
        }
      },
      // 定义计算属性的对象
      computed: {
        // 得到完整名称的计算属性
        fullName3() {  // 计算属性函数要返回一个计算的结果
          console.log('computed fullName3')
          return this.firstName + '-' + this.lastName
        }
      },

      // 配置监视
      watch: {
        // 指定被监视属性名
        firstName: {
          // 配置处理器回调, 当被监视firstName发生改变时,立即调用
          handler: function (newValue, oldValue) {
            console.log('watch firstName', newValue, oldValue)
            // 更新fullName4
            this.fullName4 = newValue + '-' + this.lastName
          }
        }
      }
    })

    // 使用vm的$watch方法来监视
    vm.$watch('lastName', {
      handler: function (newValue, oldValue) {
        console.log('$watch lastName', newValue, oldValue)
        // 更新fullName4
        this.fullName4 = this.firstName + '-' + newValue
      }
    })
  </script>
</body>
</html>